﻿package framework
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.TextEvent;
	import flash.text.TextField;
	
	/**
	 * ゲームのメインとなるクラス。これを継承する
	 * @author omega
	 */
	public class Main extends Sprite 
	{		
		private var bg:BitmapData = null;
		private var state:State = null;
		
		private var screenWidth:uint;
		private var screenHeight:uint;
		
		public function Main():void 
		{
			if (stage) initialize();
			else addEventListener(Event.ADDED_TO_STAGE, initialize);
		}
		
		/**
		 * 起動時初期化
		 * @param	e
		 */
		private function initialize(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			addEventListener(Event.ENTER_FRAME, update);
			init();
		}
		
		private function update(e:Event):void {
			if (state == null) {
				throw new Error("初期Stateが設定されてません");
			}
			
			PadManager.getInstance().beginFrame();
			state.update(bg);
			PadManager.getInstance().endFrame();
		}

		/**
		 * ゲーム起動時の初期化処理、overrideして実装
		 */
		protected function init():void {
			throw new Error("Main.init()が未実装");
		}
		
		/**
		 * init()内で利用する、画面の初期化をするメソッド
		 * @param	w
		 * @param	h
		 */
		protected function setScreen(w:uint , h:uint):void {
			if (bg == null) {
				screenWidth = w;
				screenHeight = h;
				bg  = new BitmapData(screenWidth, screenHeight, false);
				addChild(new Bitmap(bg));
			}else {
				throw new Error("複数回のsetScreenは禁止です");
			}
		}
		
		/**
		 * init()内で利用する、最初のStateをセットするメソッド
		 * @param	s
		 */
		protected function setFirstState(s:State):void {
			if (state == null) {
				state = s;
			}
		}
		
		protected function setMaxPlayer(player:uint):void {
			PadManager.getInstance().init(stage,player);
		}
	}
	
}